"use strict";

const auth = requireService("auth");
const conf = getSysConfig("authorize");
const PROTOCOL = conf && conf.protocol || "http";
const assets = requireMod("assets");
const redirectByJS = requireMod("redirect").byJS;

async function onGet(ctx) {
    let x_key = ctx.cookies.get("x_key");
    let xToken;
    let accessToken = ctx.cookies.get("jwt");
    let refreshToken = ctx.cookies.get("jwt_re");

    let entId = ctx.state.entId || ctx.cookies.get("ent_id") || ctx.params.ent || getSysConfig("entCode");
    // logger.info(`ENT > ${entId}`);
    if (x_key) {
        // logger.info(`Get ${entId} token`);
        xToken = await auth.getByKey(entId, x_key);
        if (xToken === null) {
            logger.warn(`Get XKey [${x_key}] failed`)
        }
    }

    if (xToken) {
        accessToken = xToken.jwt;
        refreshToken = xToken.jwt_re;
    }

    // 检查身份信息
    // @chrome 64.0.3282.186
    // 跳转到授权页面后不进行任何操作，在输入网址继续访问模块页面 (如：localhost:5000)
    // 这时模拟器的自定义 User-Agent 设置会失效，变成默认的 UA 导致 plat 判断失败, plat_id 变成 undefined
    // 重新刷新后 UA 设置正常
    // view-source 下不会传递任何自定义 UA
    let checkData = await auth.check(
        entId
        ,accessToken
        ,refreshToken
        ,auth.getPlat(ctx.get("User-Agent"), (ctx.query || {}).pf)
        ,`${PROTOCOL}://${ctx.get("Host")}${ctx.url}`
    );

    if (checkData) {
        // 成功获取检测数据
        // 已授权
        if (checkData.authenticated) {
            // logger.info("AUTHENTICATED");
            auth.setToken(
                ctx
                ,checkData.access_token
                ,checkData.refresh_token
                ,null
                ,checkData.user_id
            );

            if (x_key) {
                // logger.info("delet x_key");
                // 删除消费了的 x_key
                ctx.cookies.set(
                    "x_key"
                    ,"-"
                    ,{
                        "path": "/"
                        ,"expires": new Date(-1)
                    }
                );
            }
        } else {
            // 未授权的情况
            auth.setToken(
                ctx
                ,""
                ,""
                ,new Date(-1)
            );
            ctx.cookies.set(
                "x_key"
                ,checkData.auth_key
                ,{
                    "path": "/"
                }
            );

            // 使用 JS 加 Meta 的模式跳转
            redirectByJS(
                ctx
                ,checkData.redirect_url
                ,"正在跳转至授权页面"
                ,true
            );
            // ctx.redirect(checkData.redirect_url);
            return;
        }
    } else {
        ctx.set("X-Authorize", false);
        ctx.body = assets("5xx");
        return;
    }

    ctx.body = `X-Authorize-Success\n\taccessToken:${checkData.access_token}\n\trefreshToken:${checkData.refresh_token}`
}

module.exports = {
    "/auth":["GET", onGet]
    ,"/auth/:ent":["GET", onGet]
}
